package com.zjpavt.client.util;

import lombok.extern.slf4j.Slf4j;
import org.ini4j.Profile;
import org.ini4j.Wini;
import org.junit.Assert;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

/**
 * 读取ini文件的工具类
 *
 * @author gxy
 */
@Slf4j
public final class IniUtils {


    private IniUtils() {
    }

    /**
     * 根据分组名称设置或者保存key—value
     * 不存在select就创建select
     * 不存在文件就返回null
     * @param sectionName 分组名称
     * @param key        分组里的key
     * @param value      分组里的value
     * @param filePath   文件路径
     */
    public static void addOrSetIniValue(String sectionName, String key, String value, String filePath) throws IOException {
        File iniFile = new File(filePath);
        if (!iniFile.isFile()) {
            return;
        }
        Wini ini = new Wini(new File(filePath));
        ini.put(sectionName, key, value);
        ini.store();
    }

    /**
     * 根据分组名称设置或者保存key—value
     * 	 * 不存在select就创建select
     * 	 * 不存在文件就返回null
     * 	 严格地输出 中间不含空格
     * @param sectionName
     * @param key
     * @param value
     * @param filePath
     * @param isStrictOperator
     * @throws IOException
     */
    public static void addOrSetIniValue(String sectionName, String key, String value, String filePath, boolean isStrictOperator) throws IOException {
        File iniFile = new File(filePath);
        if (!iniFile.isFile()) {
            return;
        }
        Wini ini = new Wini(new File(filePath));
        if (isStrictOperator) {
            ini.getConfig().setStrictOperator(true);
        }
        ini.put(sectionName, key, value);
        ini.store();
    }
    /**
     * 根据分组名称设置或者保存key—value
     * 不存在文件就创建文件  不存在select就创建select
     *
     * @param sectionName 分组名称
     * @param key        分组里的key
     * @param value      分组里的value
     * @param filePath   文件路径
     */
    public static void addOrSetIniValueCreateFile(String sectionName, String key, String value, String filePath) throws IOException {
        File iniFile = new File(filePath);
        if (!iniFile.isFile()) {
            FileUtil.makeSureFileExist(iniFile);
        }
        Wini ini = new Wini(new File(filePath));
        Profile.Section selection = ini.get(sectionName);
        //Optional.ofNullable(selection).ifPresent(section -> section.compute(key, (k, oldValue) -> value));
        ini.put(sectionName, key, value);
        ini.store();
    }
    /**
     * @param sectionName 分组名称
     * @param keyList key的set列表
     * @param filePath 文件路径
     * @return 返回KeyList所取到的所有value 返回一个对应的map
     */
    public static Map<String, String> getIniByKeySet(String sectionName, Set<String> keyList, String filePath) throws IOException {
        Wini ini = new Wini(new File(filePath));
        Profile.Section selection = ini.get(sectionName);
        if (selection == null) {
            return null;
        }
        HashMap<String, String> resultMap = new HashMap<>(keyList.size());
        keyList.forEach(key -> resultMap.put(key, selection.get(key)));
        return resultMap;
    }

    /**
     * 无论何种问题 不能取到返回null 不可修改
     * @param sectionName 分组名称
     * @param key 分组里的key
     * @param filePath 文件路径
     * @return 返回取到的value，没有返回null
     */
    public static String getIniByKey(String sectionName, String key, String filePath) {
        Profile.Section section = null;
        try {
            File iniFile = new File(filePath);
            if (!iniFile.exists()) {
                log.error(iniFile.getPath()+ "not exist!");
            }
            Wini ini = new Wini(iniFile);
            section = ini.get(sectionName);
            if (section == null) {
                return null;
            }
        } catch (IOException e) {
            log.error(LoggerUtil.convertException2String(e));
            return null;
        }
        return section.get(key);
    }

    /**
     * 无论何种问题 不能取到返回null 不可修改
     * @param sectionName 分组名称
     * @param key 分组里的key
     * @param filePath 文件路径
     * @return 返回取到的value，没有返回defaultValue
     */
    public static String getIniByKey(String sectionName, String key, String filePath,String defaultValue) {
        Profile.Section section = null;
        try {
            File iniFile = new File(filePath);
            if (!iniFile.exists()) {
                log.error(iniFile.getPath()+ "not exist!");
            }
            Wini ini = new Wini(iniFile);
            section = ini.get(sectionName);
            if (section == null) {
                return defaultValue;
            }
        } catch (IOException e) {
            log.error(LoggerUtil.convertException2String(e));
            return defaultValue;
        }
        if (section.containsKey(key)) {
            return section.get(key);
        } else {
            return defaultValue;
        }
    }

    /**
     * @param sectionName 分组名称
     * @param filePath 文件路径
     * @return 分组里的所有key-value
     */
    public static Map<String, String> getIniSelect(String sectionName, String filePath) throws IOException {
        Wini ini = new Wini(new File(filePath));
        Profile.Section section = ini.get(sectionName);
        if (section == null) {
            return null;
        }
        return new HashMap<>(section);
    }

    /**
     * @param sectionName 分组名称
     * @param saveMap 用于保存的所有key-value
     * @param filePath  文件路径
     */
    public static void saveIniSelect(String sectionName, Map<String, String> saveMap, String filePath) throws IOException {
        Wini ini = new Wini(new File(filePath));
        Profile.Section section = ini.get(sectionName);
        if (section == null) {
            return;
        }
        section.putAll(saveMap);
        ini.store();
    }
}
